/* CsJni - .NET / Java Bridge
 * 
 * Copyright 2010 Robert E. Burke Licensed under the Apache License, Version 
 * 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at 
 * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable 
 * law or agreed to in writing, software distributed under the License is 
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 * KIND, either express or implied. See the License for the specific language 
 * governing permissions and limitations under the License. 
*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Reflection;
using System.IO;
using CsJni;

namespace JniUnitTests
{
    public sealed class JavaVMFixture
    {
        public JavaVMFixture(bool useAppCfg) 
        {
            JavaVM.AllowReuseOfExistingVM = true;
            InitJavaVM(useAppCfg);
        }

        public void Release()
        {
            if (JavaVM.IsInitialized)
            {
                JavaVM.Release();
            }
        }

        private void InitJavaVM(bool useAppCfg)
        {
            if (!JavaVM.IsInitialized)
            {
                JavaVMConfiguration c = null;
                if (useAppCfg)
                {
                    c = JavaVMConfiguration.FromAppConfiguration();
                }
                else
                {
                    c = JavaVMConfiguration.FromXml(LoadConfiguration());
                }
                c.AddOption("-verbose:jni");
                c.AddOption("-Xcheck:jni");
                JavaVM.Initialize(c, new SimpleJavaVMCallbackHandler());
            }
        }

        private XmlNode LoadConfiguration()
        {
            using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("JniUnitTests.jvmInit.xml"))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(stream);
                return (XmlNode)doc.DocumentElement;
            }
        }
    }
}
